{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "0025d1ac-fc57-4dc3-b595-67e918d4abbd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>5.1</th>\n",
       "      <th>3.5</th>\n",
       "      <th>1.4</th>\n",
       "      <th>0.2</th>\n",
       "      <th>Iris-setosa</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>6.7</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.5</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>6.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.2</td>\n",
       "      <td>2.0</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>6.2</td>\n",
       "      <td>3.4</td>\n",
       "      <td>5.4</td>\n",
       "      <td>2.3</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>148</th>\n",
       "      <td>5.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.1</td>\n",
       "      <td>1.8</td>\n",
       "      <td>Iris-virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>149 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     5.1  3.5  1.4  0.2     Iris-setosa\n",
       "0    4.9  3.0  1.4  0.2     Iris-setosa\n",
       "1    4.7  3.2  1.3  0.2     Iris-setosa\n",
       "2    4.6  3.1  1.5  0.2     Iris-setosa\n",
       "3    5.0  3.6  1.4  0.2     Iris-setosa\n",
       "4    5.4  3.9  1.7  0.4     Iris-setosa\n",
       "..   ...  ...  ...  ...             ...\n",
       "144  6.7  3.0  5.2  2.3  Iris-virginica\n",
       "145  6.3  2.5  5.0  1.9  Iris-virginica\n",
       "146  6.5  3.0  5.2  2.0  Iris-virginica\n",
       "147  6.2  3.4  5.4  2.3  Iris-virginica\n",
       "148  5.9  3.0  5.1  1.8  Iris-virginica\n",
       "\n",
       "[149 rows x 5 columns]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "df = pd.read_csv('irisdata.txt')\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "7d9aebd7-25be-4f52-95bf-831e88dd2339",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'data': array([[5.1, 3.5, 1.4, 0.2],\n",
       "        [4.9, 3. , 1.4, 0.2],\n",
       "        [4.7, 3.2, 1.3, 0.2],\n",
       "        [4.6, 3.1, 1.5, 0.2],\n",
       "        [5. , 3.6, 1.4, 0.2],\n",
       "        [5.4, 3.9, 1.7, 0.4],\n",
       "        [4.6, 3.4, 1.4, 0.3],\n",
       "        [5. , 3.4, 1.5, 0.2],\n",
       "        [4.4, 2.9, 1.4, 0.2],\n",
       "        [4.9, 3.1, 1.5, 0.1],\n",
       "        [5.4, 3.7, 1.5, 0.2],\n",
       "        [4.8, 3.4, 1.6, 0.2],\n",
       "        [4.8, 3. , 1.4, 0.1],\n",
       "        [4.3, 3. , 1.1, 0.1],\n",
       "        [5.8, 4. , 1.2, 0.2],\n",
       "        [5.7, 4.4, 1.5, 0.4],\n",
       "        [5.4, 3.9, 1.3, 0.4],\n",
       "        [5.1, 3.5, 1.4, 0.3],\n",
       "        [5.7, 3.8, 1.7, 0.3],\n",
       "        [5.1, 3.8, 1.5, 0.3],\n",
       "        [5.4, 3.4, 1.7, 0.2],\n",
       "        [5.1, 3.7, 1.5, 0.4],\n",
       "        [4.6, 3.6, 1. , 0.2],\n",
       "        [5.1, 3.3, 1.7, 0.5],\n",
       "        [4.8, 3.4, 1.9, 0.2],\n",
       "        [5. , 3. , 1.6, 0.2],\n",
       "        [5. , 3.4, 1.6, 0.4],\n",
       "        [5.2, 3.5, 1.5, 0.2],\n",
       "        [5.2, 3.4, 1.4, 0.2],\n",
       "        [4.7, 3.2, 1.6, 0.2],\n",
       "        [4.8, 3.1, 1.6, 0.2],\n",
       "        [5.4, 3.4, 1.5, 0.4],\n",
       "        [5.2, 4.1, 1.5, 0.1],\n",
       "        [5.5, 4.2, 1.4, 0.2],\n",
       "        [4.9, 3.1, 1.5, 0.2],\n",
       "        [5. , 3.2, 1.2, 0.2],\n",
       "        [5.5, 3.5, 1.3, 0.2],\n",
       "        [4.9, 3.6, 1.4, 0.1],\n",
       "        [4.4, 3. , 1.3, 0.2],\n",
       "        [5.1, 3.4, 1.5, 0.2],\n",
       "        [5. , 3.5, 1.3, 0.3],\n",
       "        [4.5, 2.3, 1.3, 0.3],\n",
       "        [4.4, 3.2, 1.3, 0.2],\n",
       "        [5. , 3.5, 1.6, 0.6],\n",
       "        [5.1, 3.8, 1.9, 0.4],\n",
       "        [4.8, 3. , 1.4, 0.3],\n",
       "        [5.1, 3.8, 1.6, 0.2],\n",
       "        [4.6, 3.2, 1.4, 0.2],\n",
       "        [5.3, 3.7, 1.5, 0.2],\n",
       "        [5. , 3.3, 1.4, 0.2],\n",
       "        [7. , 3.2, 4.7, 1.4],\n",
       "        [6.4, 3.2, 4.5, 1.5],\n",
       "        [6.9, 3.1, 4.9, 1.5],\n",
       "        [5.5, 2.3, 4. , 1.3],\n",
       "        [6.5, 2.8, 4.6, 1.5],\n",
       "        [5.7, 2.8, 4.5, 1.3],\n",
       "        [6.3, 3.3, 4.7, 1.6],\n",
       "        [4.9, 2.4, 3.3, 1. ],\n",
       "        [6.6, 2.9, 4.6, 1.3],\n",
       "        [5.2, 2.7, 3.9, 1.4],\n",
       "        [5. , 2. , 3.5, 1. ],\n",
       "        [5.9, 3. , 4.2, 1.5],\n",
       "        [6. , 2.2, 4. , 1. ],\n",
       "        [6.1, 2.9, 4.7, 1.4],\n",
       "        [5.6, 2.9, 3.6, 1.3],\n",
       "        [6.7, 3.1, 4.4, 1.4],\n",
       "        [5.6, 3. , 4.5, 1.5],\n",
       "        [5.8, 2.7, 4.1, 1. ],\n",
       "        [6.2, 2.2, 4.5, 1.5],\n",
       "        [5.6, 2.5, 3.9, 1.1],\n",
       "        [5.9, 3.2, 4.8, 1.8],\n",
       "        [6.1, 2.8, 4. , 1.3],\n",
       "        [6.3, 2.5, 4.9, 1.5],\n",
       "        [6.1, 2.8, 4.7, 1.2],\n",
       "        [6.4, 2.9, 4.3, 1.3],\n",
       "        [6.6, 3. , 4.4, 1.4],\n",
       "        [6.8, 2.8, 4.8, 1.4],\n",
       "        [6.7, 3. , 5. , 1.7],\n",
       "        [6. , 2.9, 4.5, 1.5],\n",
       "        [5.7, 2.6, 3.5, 1. ],\n",
       "        [5.5, 2.4, 3.8, 1.1],\n",
       "        [5.5, 2.4, 3.7, 1. ],\n",
       "        [5.8, 2.7, 3.9, 1.2],\n",
       "        [6. , 2.7, 5.1, 1.6],\n",
       "        [5.4, 3. , 4.5, 1.5],\n",
       "        [6. , 3.4, 4.5, 1.6],\n",
       "        [6.7, 3.1, 4.7, 1.5],\n",
       "        [6.3, 2.3, 4.4, 1.3],\n",
       "        [5.6, 3. , 4.1, 1.3],\n",
       "        [5.5, 2.5, 4. , 1.3],\n",
       "        [5.5, 2.6, 4.4, 1.2],\n",
       "        [6.1, 3. , 4.6, 1.4],\n",
       "        [5.8, 2.6, 4. , 1.2],\n",
       "        [5. , 2.3, 3.3, 1. ],\n",
       "        [5.6, 2.7, 4.2, 1.3],\n",
       "        [5.7, 3. , 4.2, 1.2],\n",
       "        [5.7, 2.9, 4.2, 1.3],\n",
       "        [6.2, 2.9, 4.3, 1.3],\n",
       "        [5.1, 2.5, 3. , 1.1],\n",
       "        [5.7, 2.8, 4.1, 1.3],\n",
       "        [6.3, 3.3, 6. , 2.5],\n",
       "        [5.8, 2.7, 5.1, 1.9],\n",
       "        [7.1, 3. , 5.9, 2.1],\n",
       "        [6.3, 2.9, 5.6, 1.8],\n",
       "        [6.5, 3. , 5.8, 2.2],\n",
       "        [7.6, 3. , 6.6, 2.1],\n",
       "        [4.9, 2.5, 4.5, 1.7],\n",
       "        [7.3, 2.9, 6.3, 1.8],\n",
       "        [6.7, 2.5, 5.8, 1.8],\n",
       "        [7.2, 3.6, 6.1, 2.5],\n",
       "        [6.5, 3.2, 5.1, 2. ],\n",
       "        [6.4, 2.7, 5.3, 1.9],\n",
       "        [6.8, 3. , 5.5, 2.1],\n",
       "        [5.7, 2.5, 5. , 2. ],\n",
       "        [5.8, 2.8, 5.1, 2.4],\n",
       "        [6.4, 3.2, 5.3, 2.3],\n",
       "        [6.5, 3. , 5.5, 1.8],\n",
       "        [7.7, 3.8, 6.7, 2.2],\n",
       "        [7.7, 2.6, 6.9, 2.3],\n",
       "        [6. , 2.2, 5. , 1.5],\n",
       "        [6.9, 3.2, 5.7, 2.3],\n",
       "        [5.6, 2.8, 4.9, 2. ],\n",
       "        [7.7, 2.8, 6.7, 2. ],\n",
       "        [6.3, 2.7, 4.9, 1.8],\n",
       "        [6.7, 3.3, 5.7, 2.1],\n",
       "        [7.2, 3.2, 6. , 1.8],\n",
       "        [6.2, 2.8, 4.8, 1.8],\n",
       "        [6.1, 3. , 4.9, 1.8],\n",
       "        [6.4, 2.8, 5.6, 2.1],\n",
       "        [7.2, 3. , 5.8, 1.6],\n",
       "        [7.4, 2.8, 6.1, 1.9],\n",
       "        [7.9, 3.8, 6.4, 2. ],\n",
       "        [6.4, 2.8, 5.6, 2.2],\n",
       "        [6.3, 2.8, 5.1, 1.5],\n",
       "        [6.1, 2.6, 5.6, 1.4],\n",
       "        [7.7, 3. , 6.1, 2.3],\n",
       "        [6.3, 3.4, 5.6, 2.4],\n",
       "        [6.4, 3.1, 5.5, 1.8],\n",
       "        [6. , 3. , 4.8, 1.8],\n",
       "        [6.9, 3.1, 5.4, 2.1],\n",
       "        [6.7, 3.1, 5.6, 2.4],\n",
       "        [6.9, 3.1, 5.1, 2.3],\n",
       "        [5.8, 2.7, 5.1, 1.9],\n",
       "        [6.8, 3.2, 5.9, 2.3],\n",
       "        [6.7, 3.3, 5.7, 2.5],\n",
       "        [6.7, 3. , 5.2, 2.3],\n",
       "        [6.3, 2.5, 5. , 1.9],\n",
       "        [6.5, 3. , 5.2, 2. ],\n",
       "        [6.2, 3.4, 5.4, 2.3],\n",
       "        [5.9, 3. , 5.1, 1.8]]),\n",
       " 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]),\n",
       " 'frame': None,\n",
       " 'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='<U10'),\n",
       " 'DESCR': '.. _iris_dataset:\\n\\nIris plants dataset\\n--------------------\\n\\n**Data Set Characteristics:**\\n\\n:Number of Instances: 150 (50 in each of three classes)\\n:Number of Attributes: 4 numeric, predictive attributes and the class\\n:Attribute Information:\\n    - sepal length in cm\\n    - sepal width in cm\\n    - petal length in cm\\n    - petal width in cm\\n    - class:\\n            - Iris-Setosa\\n            - Iris-Versicolour\\n            - Iris-Virginica\\n\\n:Summary Statistics:\\n\\n============== ==== ==== ======= ===== ====================\\n                Min  Max   Mean    SD   Class Correlation\\n============== ==== ==== ======= ===== ====================\\nsepal length:   4.3  7.9   5.84   0.83    0.7826\\nsepal width:    2.0  4.4   3.05   0.43   -0.4194\\npetal length:   1.0  6.9   3.76   1.76    0.9490  (high!)\\npetal width:    0.1  2.5   1.20   0.76    0.9565  (high!)\\n============== ==== ==== ======= ===== ====================\\n\\n:Missing Attribute Values: None\\n:Class Distribution: 33.3% for each of 3 classes.\\n:Creator: R.A. Fisher\\n:Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\\n:Date: July, 1988\\n\\nThe famous Iris database, first used by Sir R.A. Fisher. The dataset is taken\\nfrom Fisher\\'s paper. Note that it\\'s the same as in R, but not as in the UCI\\nMachine Learning Repository, which has two wrong data points.\\n\\nThis is perhaps the best known database to be found in the\\npattern recognition literature.  Fisher\\'s paper is a classic in the field and\\nis referenced frequently to this day.  (See Duda & Hart, for example.)  The\\ndata set contains 3 classes of 50 instances each, where each class refers to a\\ntype of iris plant.  One class is linearly separable from the other 2; the\\nlatter are NOT linearly separable from each other.\\n\\n|details-start|\\n**References**\\n|details-split|\\n\\n- Fisher, R.A. \"The use of multiple measurements in taxonomic problems\"\\n  Annual Eugenics, 7, Part II, 179-188 (1936); also in \"Contributions to\\n  Mathematical Statistics\" (John Wiley, NY, 1950).\\n- Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.\\n  (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.\\n- Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New System\\n  Structure and Classification Rule for Recognition in Partially Exposed\\n  Environments\".  IEEE Transactions on Pattern Analysis and Machine\\n  Intelligence, Vol. PAMI-2, No. 1, 67-71.\\n- Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\".  IEEE Transactions\\n  on Information Theory, May 1972, 431-433.\\n- See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al\"s AUTOCLASS II\\n  conceptual clustering system finds 3 classes in the data.\\n- Many, many more ...\\n\\n|details-end|\\n',\n",
       " 'feature_names': ['sepal length (cm)',\n",
       "  'sepal width (cm)',\n",
       "  'petal length (cm)',\n",
       "  'petal width (cm)'],\n",
       " 'filename': 'iris.csv',\n",
       " 'data_module': 'sklearn.datasets.data'}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import datasets\n",
    "# 导入sklearn自带的iris数据集\n",
    "iris = datasets.load_iris()\n",
    "iris#是一个标准的sklearn里面的数据结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "a964d539-41fc-4619-adb7-627b3fe84a51",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 149 entries, 0 to 148\n",
      "Data columns (total 5 columns):\n",
      " #   Column       Non-Null Count  Dtype  \n",
      "---  ------       --------------  -----  \n",
      " 0   5.1          149 non-null    float64\n",
      " 1   3.5          149 non-null    float64\n",
      " 2   1.4          149 non-null    float64\n",
      " 3   0.2          149 non-null    float64\n",
      " 4   Iris-setosa  149 non-null    object \n",
      "dtypes: float64(4), object(1)\n",
      "memory usage: 5.9+ KB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0      False\n",
       "1      False\n",
       "2      False\n",
       "3      False\n",
       "4      False\n",
       "       ...  \n",
       "144    False\n",
       "145    False\n",
       "146    False\n",
       "147    False\n",
       "148    False\n",
       "Length: 149, dtype: bool"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "df = pd.read_csv('irisdata.txt')\n",
    "df.info() \n",
    "df.describe() \n",
    "df.isnull().sum() \n",
    "df.duplicated()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "91aa41d8-3db9-41ed-a457-bb77b773d471",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.1  3.5  1.4  0.2  Iris-setosa    \n",
      "4.9  3.1  1.5  0.1  Iris-setosa        3\n",
      "5.8  2.7  5.1  1.9  Iris-virginica     2\n",
      "6.2  3.4  5.4  2.3  Iris-virginica     1\n",
      "6.3  2.3  4.4  1.3  Iris-versicolor    1\n",
      "     2.5  4.9  1.5  Iris-versicolor    1\n",
      "                                      ..\n",
      "5.5  2.4  3.7  1.0  Iris-versicolor    1\n",
      "          3.8  1.1  Iris-versicolor    1\n",
      "     2.5  4.0  1.3  Iris-versicolor    1\n",
      "     2.6  4.4  1.2  Iris-versicolor    1\n",
      "7.9  3.8  6.4  2.0  Iris-virginica     1\n",
      "Name: count, Length: 146, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# 通过value_counts()函数对类别型变量进行频数统计\n",
    "print(df.value_counts())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b27fb901-bd7c-48da-b5a3-903a1792042a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "a90ea5ca-0e85-4a45-bf53-6a33a4073e9d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>5.1</th>\n",
       "      <th>3.5</th>\n",
       "      <th>1.4</th>\n",
       "      <th>0.2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   5.1  3.5  1.4  0.2\n",
       "0  4.9  3.0  1.4  0.2\n",
       "1  4.7  3.2  1.3  0.2\n",
       "2  4.6  3.1  1.5  0.2\n",
       "3  5.0  3.6  1.4  0.2\n",
       "4  5.4  3.9  1.7  0.4"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 利用concat()函数把转换后的数据对象全部合并在一起变成新的数据对象，命名为trainData_X\n",
    "trainData_X = df.iloc[0:,:4]\n",
    "trainData_X.head()\n",
    "# 72 columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "b0ca9631-964b-4569-a4e7-0389c23f4a6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "2    50\n",
       "0    50\n",
       "1    49\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构造目标变量y的数据对象\n",
    "# 当前的目标变量good_bad的取值是'good'和'bad'，一般我们习惯把二分类的类别值编码为0和1，1一般表示类别比较少的那一类，他们往往是我们感兴趣的\n",
    "df['target'] = 0\n",
    "df.loc[(df.iloc[0:150,4] == 'Iris-setosa'), 'target'] = 1\n",
    "df.loc[(df.iloc[0:150,4] == 'Iris-versicolor'), 'target'] = 2\n",
    "trainData_y = df['target'] \n",
    "trainData_y.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "a40ad98d-db3c-46e5-96b9-7b24cb392913",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(trainData_X, trainData_y, test_size=0.3, random_state=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "2484dc28-7211-4245-82d4-eb5d2e6f17a7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(104, 4) (45, 4)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape,X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "ed14f70e-278d-4e5d-bec7-4a1f44f17a83",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "target\n",
       "2    18\n",
       "1    14\n",
       "0    13\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "afcfda67-a55f-4feb-9bc9-333c3f92153d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>SVC(C=10000000000.0, kernel=&#x27;linear&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;SVC<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>SVC(C=10000000000.0, kernel=&#x27;linear&#x27;)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "SVC(C=10000000000.0, kernel='linear')"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC # \"Support vector classifier\"\n",
    "model = SVC(kernel='linear', C=1E10)\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "b38e6e75-9cc0-42df-ad44-007af0d706ea",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.87      1.00      0.93        13\n",
      "           1       1.00      1.00      1.00        14\n",
      "           2       1.00      0.89      0.94        18\n",
      "\n",
      "    accuracy                           0.96        45\n",
      "   macro avg       0.96      0.96      0.96        45\n",
      "weighted avg       0.96      0.96      0.96        45\n",
      "\n",
      "[[13  0  0]\n",
      " [ 0 14  0]\n",
      " [ 2  0 16]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import auc\n",
    "\n",
    "# 利用模型对测试集进行预测，输出target预测标签值和概率\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "# 通过RandomForestClassifier类定义一个随机森林模型，名字叫rf\n",
    "#rf = RandomForestClassifier(n_estimators = 100)\n",
    "\n",
    "# 对lr模型进行训练(fit)\n",
    "#rf.fit(X_train, y_train)\n",
    "y_test_pred = model.predict(X_test)\n",
    "#y_test_prob = model.predict_proba(X_test)\n",
    "\n",
    "# 分类评估汇总报告classification_report\n",
    "print(classification_report(y_test,y_test_pred))\n",
    "\n",
    "# 误分类矩阵 confusion_matrix\n",
    "print(confusion_matrix(y_test,y_test_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1384c21a-08ac-4078-9b6c-c3ad4865ce94",
   "metadata": {},
   "source": [
    "## 4. 聚类分析\n",
    "4.1 首先寻找最优的聚类个数\n",
    "使用分层聚类图（hierarchy.dendrogram）来查看聚类的情况，它显示了每一个样本根据相似度大小如何逐步合并的过程。如果样本数量太多，不适合用这个方法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "f2207001-75cf-41ae-849c-504381b22925",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "std = StandardScaler()\n",
    "X = std.fit_transform(trainData_X*1.0)\n",
    "import scipy\n",
    "from scipy.cluster import hierarchy\n",
    "dendro=hierarchy.dendrogram(hierarchy.linkage(X,method='ward'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "f8d8b1ac-ea80-485a-8ef0-df7558dcc6dd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiAAAAGcCAYAAADgaRuPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABMOUlEQVR4nO3deVwU5eMH8M8CCwJyiICAopEXCl6pYWpGWRQqZmiipHmViohaGWrmT7544C0eLy1LTSuPvErNOwW8b8Ej7wsMQsU45Ib5/UE77S4L7MIyLPh5v168XHdnZ5555tmZzzzz7KxMEAQBRERERBIyquoCEBER0YuHAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpKcSVUXQF1hYSH++usvWFlZQSaTVXVxiIiISAuCICA9PR0uLi4wMiq7f8PgAshff/0FV1fXqi4GERERlUN8fDwaNGhQ5nQGF0CsrKwAFK2AtbV1FZeGiIiItJGWlgZXV1fxOF4Wgwsgissu1tbWDCBERETVjLbDJzgIlYiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkDO7H6GoaQRCQlVdQ1cUgon+Zy421/rEsIqo8DCCVSBAE9PvmJM4/eFbVRSGif3VoVAdbRr/GEEJUxXgJphJl5RUwfBAZmHMPnrFXksgAsAdEIue+fhsWpsZVXQyiF1ZmbgE6zDxU1cUgon8xgEjEwtQYFqasbiIiIoCXYIiIiKgKMIAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDmdAkhERAQ6duwIKysrODo6ok+fPrhx44bKNEOHDoVMJlP569Spk14LTURERNWbTgEkOjoawcHBOHXqFA4ePIj8/Hz4+Pjg+fPnKtO99957SExMFP/27Nmj10ITERFR9Waiy8T79u1T+f/atWvh6OiI8+fPo1u3buLzZmZmcHJy0k8JiYiIqMap0BiQ1NRUAICdnZ3K81FRUXB0dESzZs3w6aefIjk5ucR55OTkIC0tTeWPiIiIarZyBxBBEPD555+ja9eu8PT0FJ/39fXFzz//jMOHD2PhwoU4e/Ys3nrrLeTk5GicT0REBGxsbMQ/V1fX8haJiIiIqgmdLsEoGzt2LOLi4nDs2DGV5wMCAsTHnp6e6NChAxo1aoTff/8d/v7+xeYzZcoUfP755+L/09LSGEKIiIhquHIFkJCQEOzcuRMxMTFo0KBBqdM6OzujUaNGuHXrlsbXzczMYGZmVp5iEBERUTWlUwARBAEhISHYsWMHoqKi4ObmVuZ7nj59ivj4eDg7O5e7kERERFSz6DQGJDg4GD/99BM2bNgAKysrJCUlISkpCVlZWQCAjIwMTJw4ESdPnsT9+/cRFRUFPz8/2Nvb44MPPqiUFSAiIqLqR6cekJUrVwIAvL29VZ5fu3Ythg4dCmNjY1y+fBnr16/HP//8A2dnZ7z55pvYvHkzrKys9FZoIiIiqt50vgRTGnNzc+zfv79CBSIiIqKaj78FQ0RERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSnE4BJCIiAh07doSVlRUcHR3Rp08f3LhxQ2UaQRAQFhYGFxcXmJubw9vbG1evXtVroYmIiKh60ymAREdHIzg4GKdOncLBgweRn58PHx8fPH/+XJxm3rx5WLRoEZYvX46zZ8/CyckJ77zzDtLT0/VeeCIiIqqeTHSZeN++fSr/X7t2LRwdHXH+/Hl069YNgiAgMjISU6dOhb+/PwBg3bp1qFevHjZs2IBRo0bpr+RERERUbVVoDEhqaioAwM7ODgBw7949JCUlwcfHR5zGzMwMb7zxBk6cOKFxHjk5OUhLS1P5IyIiopqt3AFEEAR8/vnn6Nq1Kzw9PQEASUlJAIB69eqpTFuvXj3xNXURERGwsbER/1xdXctbJCIiIqomyh1Axo4di7i4OGzcuLHYazKZTOX/giAUe05hypQpSE1NFf/i4+PLWyQiIiKqJnQaA6IQEhKCnTt3IiYmBg0aNBCfd3JyAlDUE+Ls7Cw+n5ycXKxXRMHMzAxmZmblKQYRERFVUzr1gAiCgLFjx2L79u04fPgw3NzcVF53c3ODk5MTDh48KD6Xm5uL6OhodO7cWT8lJiIiompPpx6Q4OBgbNiwAb/99husrKzEcR02NjYwNzeHTCbDhAkTMHv2bDRt2hRNmzbF7NmzYWFhgcDAwEpZASIiIqp+dAogK1euBAB4e3urPL927VoMHToUABAaGoqsrCyMGTMGz549g5eXFw4cOAArKyu9FJiIiIiqP50CiCAIZU4jk8kQFhaGsLCw8paJiIiIajj+FgwRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHI6B5CYmBj4+fnBxcUFMpkMv/76q8rrQ4cOhUwmU/nr1KmTvspLRERENYDOAeT58+do06YNli9fXuI07733HhITE8W/PXv2VKiQREREVLOY6PoGX19f+Pr6ljqNmZkZnJycyl0oIiIiqtkqZQxIVFQUHB0d0axZM3z66adITk4ucdqcnBykpaWp/BEREVHNpvcA4uvri59//hmHDx/GwoULcfbsWbz11lvIycnROH1ERARsbGzEP1dXV30XiYiIiAyMzpdgyhIQECA+9vT0RIcOHdCoUSP8/vvv8Pf3Lzb9lClT8Pnnn4v/T0tLYwghIiKq4fQeQNQ5OzujUaNGuHXrlsbXzczMYGZmVtnFICIiIgNS6fcBefr0KeLj4+Hs7FzZiyIiIqJqQucekIyMDNy+fVv8/71793Dp0iXY2dnBzs4OYWFh6Nu3L5ydnXH//n189dVXsLe3xwcffKDXghMREVH1pXMAOXfuHN58803x/4rxG0OGDMHKlStx+fJlrF+/Hv/88w+cnZ3x5ptvYvPmzbCystJfqYmIiKha0zmAeHt7QxCEEl/fv39/hQpERERENR9/C4aIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyJlVdAKIXiSAIyMrPqupivJAy8wqUHmcBMuMqLM2Ly9zEHDKZrKqLQQaAAYRIIoIg4OO9H+PS40tVXZQXklAoBzADAOD9yxuQGeVVbYFeUO0c22Hde+sYQogBhEgqWflZDB9VSGaUB6sWk6u6GC+8i8kXkZWfBQu5RVUXhaoYAwhRFYjqHwVzE/OqLgaRZLLys+D9i3dVF4MMCAMIURUwNzHnGSARvdD4LRgiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESS0zmAxMTEwM/PDy4uLpDJZPj1119VXhcEAWFhYXBxcYG5uTm8vb1x9epVfZWXiIiIagCdA8jz58/Rpk0bLF++XOPr8+bNw6JFi7B8+XKcPXsWTk5OeOedd5Cenl7hwhIREVHNYKLrG3x9feHr66vxNUEQEBkZialTp8Lf3x8AsG7dOtSrVw8bNmzAqFGjKlZaIiIiqhH0Ogbk3r17SEpKgo+Pj/icmZkZ3njjDZw4cULje3JycpCWlqbyR0RERDWbXgNIUlISAKBevXoqz9erV098TV1ERARsbGzEP1dXV30WiYiIiAxQpXwLRiaTqfxfEIRizylMmTIFqamp4l98fHxlFImIiIgMiM5jQErj5OQEoKgnxNnZWXw+OTm5WK+IgpmZGczMzPRZDCIiIjJweu0BcXNzg5OTEw4ePCg+l5ubi+joaHTu3FmfiyIiIqJqTOcekIyMDNy+fVv8/71793Dp0iXY2dmhYcOGmDBhAmbPno2mTZuiadOmmD17NiwsLBAYGKjXghMREVH1pXMAOXfuHN58803x/59//jkAYMiQIfjhhx8QGhqKrKwsjBkzBs+ePYOXlxcOHDgAKysr/ZWaiIiIqjWdA4i3tzcEQSjxdZlMhrCwMISFhVWkXERERFSD8bdgiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyTGAEBERkeQYQIiIiEhyDCBEREQkOQYQIiIikhwDCBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIciZVXQAioheRIAjIys+q6mJIRnldX6T1BgBzE3PIZLKqLobBYQAhIpKYIAj4eO/HuPT4UlUXpUp4/+Jd1UWQVDvHdlj33jqGEDW8BENEJLGs/KwXNny8iC4mX3zhen20wR4QIqIqFNU/CuYm5lVdDKoEWflZL1xvjy4YQIiIqpC5iTks5BZVXQwiyfESDBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpJczbsRmSAAeZlVXYoiuQVKjzMBGFdZUYqRWwD8XQIiIqoiNSuACAKw5l0g/nRVl6SIYAZgbdHj+U0AWU6VFkeFaydg+D6GECIiqhI1K4DkZRpO+ABgIcvB/VqBVV0MzeJPFdWXqWVVl4SIiF5ANSuAKJt4GzDl7ysUk5sJLGhS1aUgIqIXXM0NIKYWPLsnIiIyUPwWDBEREUmOAYSIiIgkxwBCREREkmMAISIiIskxgBAREZHkGECIiIhIcgwgREREJDkGECIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCQ5BhAiIiKSHAMIERERSY4BhIiIiCTHAEJERESS03sACQsLg0wmU/lzcnLS92KIiIioGjOpjJl6eHjg0KFD4v+NjY0rYzFERERUTVVKADExMWGvBxEREZWoUsaA3Lp1Cy4uLnBzc8OAAQNw9+7dEqfNyclBWlqayh8RERHVbHoPIF5eXli/fj3279+P7777DklJSejcuTOePn2qcfqIiAjY2NiIf66urvouEhERERkYvQcQX19f9O3bF61atcLbb7+N33//HQCwbt06jdNPmTIFqamp4l98fLy+i0REREQGplLGgCiztLREq1atcOvWLY2vm5mZwczMrLKLQURERAak0u8DkpOTgz///BPOzs6VvSgiIiKqJvQeQCZOnIjo6Gjcu3cPp0+fRr9+/ZCWloYhQ4boe1FERERUTen9EkxCQgIGDhyIJ0+ewMHBAZ06dcKpU6fQqFEjfS+KiIiIqim9B5BNmzbpe5ZERERUw/C3YIiIiEhylf4tGKLqThAEZOVnVXg+yvPQx/zMTcwhk8kqPB8iKlt59gP6+MzX5M85AwhRKQRBwMd7P8alx5f0Ol/vX7wrPI92ju2w7r11NXbnRGQo9LEfKO9nviZ/znkJhqgUWflZeg8f+nIx+aJeelKIqHRVuR+oyZ9z9oAQaSmqfxTMTcyruhjIys/SSw8KEelOqv3Ai/A5ZwAh0pK5iTks5BZVXQzSkb7G8OiTvscD6VtNHndQURXdD1R0LElpqtt2YwCpSoIA5GVKu8zcTM2PpSK3AKrRB4Sqt8oaw6NPhniWW5PHHVSl8rZHbdtIddtuDCBVRRCANe8C8aerrgwLmki/TNdOwPB9DCEkCUMew2PIFOMO2OOnX5XdHqvbdmMAqSp5mVUbPqpK/KmidTe1rOqS0AvGUMbwGLIXYdyBodBne6yu240BxBBMvA2YVo/EWm65mVXT40L0L47hIUPC9sgAYhhMLdgjQERELxQGEKIqUJFvZujrGxTVbcQ8EdUsDCBEEtPnNzMqct23uo2YJ6KahXdCJZKYoXwzoybfYZGIDB97QIiqUFV8M6O6jpgnopqFAYSoCnEkPBG9qHgJhoiIiCTHAEJERESSYwAhIiIiyXEMCBGRgamqX/Ct6l/p5b1pXiwMIEREBsRQfsG3Kr4pxXvTvFgYQIhqEG3OnHU9y+VZqbQM5T4xVaG6/ZorVQwDCFENUZ4zZ23OcnlWWnVelF/w5b1pXkwMIEQ1RGWdOfOstOrwPjFUkzGAENVA+jhz5lkpEVUmBhCiGohnzkRk6BhAiIhIb8rzFeKKfv2XA6WrJwYQIiLSC318hbg8l/04ULp6qh4BRBCAvMyyp8vN1Py4JHILgA2WiCqZLr0CFekNqOqegKr6CjEHSldPhh9ABAFY8y4Qf1q39y1oUvY0rp2A4fsYQoio0lSkV0DX3gBD6gmQ4ivEHChdvRl+AMnL1D18aCv+VNH8TS0rZ/5UbSnOWDWdjVb1WeaLrrJ7E/S9faXsFTCkngAOhKayGH4AUTbxNmCqhwadm6ldDwm9kEo6Y1WcaRnSWeaLRorehMrcvpXVK8CeAKqOqlcAMbVgbwVVurLOWA3pLPNFI0VvQmVuX/YKEP2negUQIokpn7HyLNOw6Ls3gduXDIkUA5er+nIyAwhRKXjGari4baimkmrgclVfTmYAISIi+pemngdtehj02Zsg1cDlqr6czABC9IIqq4tXl27dqu7KJdIHbXoeSuphqKzehMoYuGwolxsZQEg32t4UTp2uN4lTx5vG6ZWuXbxl7ayquiu3ptJ2HIAhfN24JqhIz0Nl9SbU5EuNDCD6Vll3bQWq/iBc3pvCqSvPV6B50zi90ncX78Xki0jJTtHqTI0HPu2UdxyAIXzduCbQtufBUHoTqqOaG0BKCwK6HPx1OehX5l1bgao/CFfmTeHKwpvGVRr1Ha0gCPj04Ke4/OSyTvPhgU+/KnscQFVf/9dVecZmVCTs1uSeB0NRMwOILkGgrIO/Lgf9yj5AG9JBWF83hSsLbxpX6dR3tJl5mTqHD11UtwOfIdDnOIDqeMZe3rEZhhJ2S7qz8oveG1gzA4g+g0B5D/r6PEAb4kH4Bbop3It8W/YX/cBnKF70s/Hy9gYZQtgt7c7KlRWQqssA85oZQJSVNwhU9KD/Ah2gy02b8TJVPFbmRb8te0088JW0c5b6q5Y1gXpdVuYlEQVtQrEUYVfbE5PSwlNlBKTqNMC85gcQBgHDVJ7xMlUwVia7IJu3Za9BtN05S/1Vy+qorLqsrEsihhCKy3tioghPlRmQKmOAeWXt4ww3gAgCkPu8+BlwVX8TpDKU1RNQWYNmq1I1/JVj3pZdO+XtYZCid6GiO2dN3/Z5UXtFylOXhhjYldurtpdZy/t7UVKHJ10voQqCgOyCbABF6+i73Vd8rKDP9m64AeTHD4An51WfW9Ck6r8Jom+69gSU1QvQoCMw+FfN9WOo4aQi42UEAcj798ORlwksaV30WDmo6Wm9y7PzkOKuioY0RqUiPQylnR1XxjqWtnMu7ZtA6mVnr0jZBzpDDeyltVdtL7Ma8omJLvssbeoC0G97N9wA8ugcYKZhBQ3pmyAKih4MTT0VZR389N0TkHAWiKiv+TVDDW/lvUxWWnhTDmpVtN5S3FXR0MaoVMaNnPSxjpoCDFByeNHlm0CGflavrjLGuhjCZRGg9KAKFF8vbdprWdvXUNa9orT97OqzvRtuAFFQnB1L9U0QXcNESQdBRVl1OfiV1hOgj/U3xPBWEdqGtypabynuqljermAp6OtGTtqso+KyiKYDZ0W/hVDSelTG2W5ZlwOAssOBLoMQa9JYl7KCKlD6eqlvZ0PrzSiJLgOBtQ2Wmtp8ZdSH4QcQbc+OlcdRlDRmoqzeiPKEibIOgroc/LRdV10vWRji13j1TVOdGNB6l3QQU77mCpR83RUoe+dhaF3B2pwZlrTzLGldj3x4BOOOjCvWO1Fab0hFv4Ug1RmuvrrA9TEI0RB7dcpS0d4MfWxnQRBUyqPv33DRtDxdBgJrGyylavOGH0C0oa+ueG3CxPMngKW95nkoHwQr8+BXVlDR9i6wCoY6NkQXEn7bSdeDpuI1bS8tKOi681Asozzl08eZt640rX9Zl1VkMlmpl0bKOnAqQlpmXibe3PImAMO5IZQuXeAp2Smwq2VXZpl1HYSobXDVto1V1fgk5fUWBAHPcp6JwV45JJRE0/pp0/P06cFPxf8rethWdl9Z3tUok65h09CCZfUIIIJQ+rdhKqMrfuItYOPAorEoykobCFtZB0FN6w/odklIQVMoqqwxEhW9Hb4BBqPyHDRLUp6dR1kHnvKUT9sz79YOrbHq7VWQyWR6OdBUtGciqn8UahnXQnZBdrGeo5KWqbhM88mBT1TWUddtp80BqiIHX8UBtKTBsNqWWdsz2bIGSyuXV9s2VtYlkdLaU0Uph3H1Mow8NBI/+f6k82dIm54n9e10MfmiSg9nWSpyx1RNYVPRw6rt50PbMqVkp6j08JR3+xl+ANF0QC0tBOitK15WPHwolBVktA0M2kxX0voD5bskVJ71KQ993A6/vMGotHE8QIWCTWXdVEjb32Mpa0dYVvky8zJhqbady7rXiULc4zh02tgJgG4HGl3GWehy6aiWcS2MPjRa57EdJR0oFDvUsg4A2hygdK0TTQFAUZaSenzU21t5A482YydaO7TGj+/9CCMjI60/A2UFbOX2pAgjFnILvQYRTWWIexxX6ue0pHKrtxEFTT0qe/33igd8TUq6VKPtWCVtBlXrMvZJvf0pylfSPNTXTTE/XRl+AMnL0nwQK+mgqdwLoekMPOMJYJr5X0jR5mCky0BYbQNDadM16AgMPwAYGZUeKOJPFd0rxax26eXWVMa8LM1fWy2pPnTphQH08+2e8gSjssbxAP99VdnUskI9LPq8qZAuv8eibdDRNF5CcfZXEm3XSbk3pqKDRIH/eibK2rErKy04aVtHygcKbXfYZR2gtDn4KtcfUPzAo6n7XtHjo3w5QZuDF1D6AV6bnri4x3EYvG9wsbajbXsp64CsCCPlHfxaUo9UWWUoa8xGVP8oAP/VY2k9KspKu+xV2qUabdpzae1UeTtrGxRLWyddvxmjK8MPIMom3i76V5vejJIOREtbq/5fm7NsRahR3iEqLgOpKyswKA6opU2XcBZY7QN8clD1eU2Xhdb3KZpOEWrKGuNR1gFa08G5rLCkPL2m3ofxcUVlkJuXPQhYPRjlKN2MztSi+LooKLaHNsFH8VXlCl56KuugqWnnpjg71tSlqTxfZeUNOprGSyjO/kpbJ/WDtvLlgBEHRuDq06sASj9IqvfeKB8IFWfSyrTdsZekvHWkXNdlBRrlwKC8XEC1t0D9YHjkwyPijr6k+isp0Ch332vq8dHm4AX8d4BXDyLqZd3rvxd1zOoguyC7WD1qajvaXuJRrufSwoj6ZUZtLkmU1iOl3DY1XZ4oa8yG+ns0tZGyPlPqtLlUU9pYpdJCgXKQU/9c6jI/TeukvN32+u8V66YiJ19GZU9SPitWrICbmxtq1aqF9u3b4+jRoxWfqamF9t/+0GVcyPMnqgczTQQBWP/+f/9f0ARY817p75t4G5jyqOgArDwfdcqvKzw6q2H8hIbLQorpFCFBOZwtaALMdlEtZ1n1ojg4r34HyMn4L1CUFpYi6hcto7CwqAyzXVTLsaR10f9/6lsUEkwtVf/kFkXL+fH9oumWKIXEhU2LnlNfF222x8Tb/4VWTeJPAc8eAhmP/73r7vOy24ESxY5P+QM48tBICIKgcec2ZN8QFBYW4uO9H8Nrg5fK+3y3+8Jrgxe8NnhhyL4hKuFFsZOvZVxLfC4rP0urwXQKe/336rReyjufWsa1xAOW4uCpoL7jVBwYSuq9UZxJq5e9ojt2RR3p61sHUf2jcGrgKXjU9RCfU2xD9W2jfulMvU2Mjxov1ktZ9RfVP0oMNepKCkjq8yhtWysOUMptUb0dBv0RpNLWymo7JXXfl0S5vkqr55I+K96/eGPQ3kF4nvtcXLY29aKuomM2dPlM6ToPRbsad2Sc+Jym9ldSe9H0udRmfqWtk/J2s6tlVyyM67pPAiopgGzevBkTJkzA1KlTcfHiRbz++uvw9fXFw4cP9b8w9bP+sg7w42IB53aqr2sTJvIyix/840/9dxdOTeTmwE/+qgfU9X2KL0f5DGJ8bMnzU6Y+nTaXaorNQ0PwUVAOFsrlLek98aeAzKfafSVZmSI4RdQHEkoYc6NpHtpsD/XAOvEWUL+D6nuWtv4v3KiHtTKUdtAsaef2LOeZVl8VVN8JlhRotP3Aa3tgLi1UKdN256tpurKChT527BWlbWBQp22QKuvAU5bSgor6Ab6kA1RJbVHTwask2raXkpRWz6V9VpSDlDYH5LKUp83pI+yWdffYsgKSenspbT20nZ82NG1371+8MerQKK3er1ApAWTRokUYMWIEPvnkE7Ro0QKRkZFwdXXFypV6/jqSprP+sg7wppZA4sXi8yorTCjTNiRoGr+isWdDiVzL8Q6lTafpQFtm8CklWCjXi/J7SuthmHgb+Oqvon+V553x5L/eBqD04DRO6X1jTmqeBtB+e5Q2sFgh/hRQjmuZpX3wS3pNfWdZ0Z2HPmh7ANV2R6XtzrE88y5Lea5Jl6Q8ByhtzybLQ9ugou0BqrwHbn1cklCma/nKOiBrq7Lv11FR+v7sVDTkl9QbF/e4lJNaDfQ+BiQ3Nxfnz5/H5MmTVZ738fHBiRMnik2fk5ODnJwc8f+pqakAgLScfw+WaemA+Djt3zf9+/+nycDtU6ozvHsGeJqkOp3KPJQeh1wq+ndZ29KnU19uVqF20ym/Nvo48E2XsqfTdn6lTpcB3D2rW71kFeheL9n5Jc8vOx8oLAAiGquWY36r/x5PSSgKIiUtN1upTPm19Lw9TgDfdC56POpEUU/Jv8vNTEtHQVYBACBd6XHav/PT9Fp+Zn6J0ym/pvyevMw8raZTn982v23ou6uvTuUrz3TKy9HHvEuro4qWNS0tDfnyfGTmZYrPvb7udZwKPKXyXHmXq+22kXJ99bke6m2xPMvVR3vRtnxSfQYMZbrytL/yzK88897zwR4AQI8dPcTntL4UI+jZo0ePBADC8ePHVZ6fNWuW0KxZs2LTT58+XQDAP/7xj3/84x//asBffHy8Vnmh0r4Fo+lmR5q+WjVlyhR8/vnn4v8LCwuRkpKCunXrVvmdCYmIiEg7giAgPT0dLi4uWk2v9wBib28PY2NjJCUlqTyfnJyMevXqFZvezMwMZmZmKs/Z2trqu1hERERUyWxsbLSeVu+DUE1NTdG+fXscPKh6D4uDBw+ic+fO+l4cERERVUOVcgnm888/x+DBg9GhQwe89tprWLVqFR4+fIjRo0dXxuKIiIiomqmUABIQEICnT58iPDwciYmJ8PT0xJ49e9CoUaPKWBwRERFVMzJB0PHWZUREREQVVGm3YiciIiIqCQMIERERSY4BhIiIiCTHAEJERESSYwAhIiIiyVXardj14fTp0/Dy8hL///jxYzg4OOD48eOIjIxEZmYm7OzsMHjwYPj4+IjTnThxAvHx8WjQoAG6dCn6AbjExETY2NggPj4eTZs2xe7du9GxY0fUrl0b2dnZcHBwEN9//Phx8X0HDhwAUHSL2eXLlyMkJAQ+Pj5IT09XeV9MTAwsLS2xbNky5ObmYvTo0TAxMdFYDmdnZ5X3//XXX3j06BHc3Nxw8+bNYu8Bin60T/mOsTk5OcjNzcW1a9dU6mjdunWoX78+Vq5cCZlMhpYtWyIsLAzTp09HSkoKBgwYgKVLl6Jv374YMGAAjhw5gmfPnqFXr144fvw4MjIy0KpVKzx+/Bhubm7o06cPhgwZgoEDB6J27dricm7duoWGDRuKZVJeB2tra5iamuLIkSNYt24dCgsL8dZbb2HPnj146aWXMG/ePCQmJiI6Ohq//fYbjIyMIAgC/Pz8MHDgwGLbXXnbK78WHR0NJycnle3p7OwMADh8+DDWr1+PCRMmoFmzZliwYAG+/vrrYtPl5uZi6dKlaN++PTIyMmBtbY2kpCSx/hXrVVhYKC43NzdXXL+MjAy8++67MDU1LbZtlNuHYrsDKNZ2SlsP5bZY2mcjNzcXqampuHLlCm7evIlhw4aJZTp06BD++OMPBAYGYvr06fDz80N2djYyMjLw8ccfi3cozsnJwdOnT4u1RXt7ezRo0EAsn4eHB/Lz89G0aVNs27YNTk5O6NKlC3bs2IHOnTvj+vXrGutFsQ0zMzMRGxsLLy8vcX0FQRCXa29vL9aZoo23a9cOS5cuhYODA0aOHIn4+HiEhobC2toaVlZW6NmzJ3bv3o2MjAxYWVkhJCQELVu2xNSpU+Hq6qrxHkRXrlxB06ZNsWbNGty9exfJyckoKCiAlZUVBgwYgKSkJPTq1Qvp6emIi4vDnTt3itXZzZs3cefOHbRr1w5r166Fv78/mjdvLm4fxbbOy8srtn7q9RIbG4vr16+jV69esLS0RFRUFLy9vZGenl7sc67eDpT3eTKZTOM+5OrVq/Dw8Cg2jwcPHqBRo0Yq7fncuXPF5vHgwQPExsbi1Vdfxdq1a/HgwQN88cUXaNq0qcr8cnNzsW/fPlhZWSEjIwNt2rTByZMn0atXL8TGxuLhw4c4dOgQ/vnnHwQHB4vtpUWLFmjVqhVmzJiB+/fvw9nZGaGhofjiiy/Qo0cPXLlyBTk5OZDJZJg2bZq4XPX9fVl1/t1338HHxwczZsxATk4OAgICEBcXh0ePHqFx48YYMWIEzM3NERISAhsbGwwePBhz5szBO++8g8DAQADA4sWLERwcDFNTU/To0QNLlizRWLeHDh3CN998g+nTpxdbD19fX8TExIhtNiAgAJaWlrCwsECTJk2wZs0aZGRk4NGjRwgODkbTpk3x+PFjfPfdd3j06BFsbW3x999/Izs7G1ZWVhg1ahRatmwJAFi2bBlCQkLEz9/OnTvRu3dvAEB4eDiysrIQGBiIsLAwGBsbw8HBQWXdly1bht69e+P27dto164dFi1ahKZNm8LPzw/Lli1DZmYmcnNz0bx5c/j5+eHMmTPF2q02DO5ruAMHDoRMJoMgCDh37hxeeeUV/Pjjj5gyZQp+++03DB48GImJiZDJZLCzs8PkyZNRv359vP322+jduzdOnjyJNm3aoGHDhpg/fz4eP36Md955BwUFBdi/fz9GjBiBM2fOwMzMDHfu3EHjxo1ha2uLM2fOoH379jA3N8e6detQt25dTJs2DUuXLkVgYCAcHBywbt06ODg44P3338euXbtgZWUFOzs7hIeHY+zYsYiJiUFMTAxsbW3h4eGBzz77rFg5zp49i9q1a6Nu3bqwtbXF9evX0aZNG8THx+PPP/9EmzZt8NFHH2HJkiW4f/8+Bg0ahOnTp6Ndu3Zwd3eHu7s7atWqhYMHD8LBwQF79uyBk5MTpkyZgoCAAISGhgIoaoABAQFISEhAvXr18PDhQ7i4uCApKUmsow8//BD29vb4/fffkZiYiE8++QTHjh1DXFwc3N3dUadOHVy/fh2hoaHYtGkTrl27BkdHR3Tp0gU//fQTCgoK8H//93+Ij4/H06dPER8fjzp16uDevXvo1q0b7O3tsXXrVri5uSE5OVncySm2R1RUFK5cuSJu9/Pnz6N9+/Y4f/482rVrhx9//BEAMGjQIFy4cAEdO3bE7t27UbduXbz22mvYvXs3GjdujJdffhn9+vXD1q1bsWnTJgBA//79YWtrCwcHB5w7dw5ZWVlwcXFBv379MHnyZHTt2hUAcP78eTx58gTh4eH47bffkJ6ejqlTp+Lhw4dYv349OnXqhPj4eBw6dAgvv/wyxo8fj/Pnz8Pe3h729vaws7PD7Nmz4enpWWzbXL58GXK5HN26dUNBQQEuXLiAsWPHYteuXTh37hxMTU3RunXrYusxbdo0dO/evVhb3LNnD0xMTCAIQrE6mjhxIk6cOIFhw4ZhxowZMDMzw//+9z8EBARg2LBhiIyMREBAANzd3XH06FHMnTsXmzdvRkxMDEaMGIHp06ejU6dO4voqt8Xp06dDLpeL9Tdp0iQEBwfjzJkz+Ouvv/D8+XM0bdoUWVlZePDgAYKDg2FnZ4d9+/bhu+++A1AUbj777DOsWLECH330ER4+fIj69eujX79+iIiIQPfu3cXl1q1bF6+88goKCgqwe/duREZGYsGCBeK6u7q6IisrC3Xq1MH333+PtLQ0tGvXDhcvXoS1tTWWLFmCzZs3Y+jQoVi+fDmePXsGLy8v9OrVC3379oWZmRkEQUC7du3w7rvv4q233sKKFStgbm6O7du3Iy0tDZ6enli6dCm2bt0KIyMjxMbGYubMmcXq7KWXXhLLZ2lpiRs3buC1117DwYMH0axZMzRq1Aj37t1DYWEhXF1dUadOHbRt2xYjR44EAIwbNw7R0dHw8fHBrl270KJFC9SpUwfz5s1D3759ERISgl27dql8ztXbAQBMmDBB3NcIgoDQ0NBi+xBbW1u89dZb4n5SEASYm5sjOjoaZmZm+Pjjj8X9WUhICBo2bKgyj7Nnz6KgoADp6emIjIzE+++/jwEDBuDBgwewtrZG+/btIZfLsXnzZty5cwdffvmluI9esmQJtm7dCrlcjrNnz+LYsWOYNGkSjh07hjlz5sDR0RGDBg2Cj48PZs2ahZEjR8LIyAiJiYnw8PDA4cOHcerUKVhaWuLll19G//798eDBA/zzzz/o3bs3Xn75ZXz//ffIyMiAg4NDsTqPjY1F06ZNIQgC9u7dC0dHR5w5cwaWlpbw9PTEpk2bsH37dixfvhwODg7o0qULtm3bhh49eiAxMRF//PGHGEwB4Mcff4Sbmxu6du2KLVu24KWXXoK7uzv69OmD1NRUyOVyAEVhRy6XQy6XF1uPFi1a4MKFC7C2tkZYWBh++eUXtGjRAteuXYOLiwsmTJgAR0dHfPDBBxg4cCAePHiAlJQUREREYPfu3Th16hRcXFywbt06pKWloV69emL59u7di8aNG2PIkCGIiYnBmTNnMHHiRAiCgGnTpiEuLg4BAQFo1qwZkpKS0LZtW5V1P3nyJJ4/f45ly5ZhwYIFkMlkMDIyQkFBARwdHZGdnY327dvD29sbI0aMQGRkJLZu3Yp58+Zh5syZWLFihVbHe4PrAWnbti3q16+PQYMGwdbWFpaWlhg1ahSOHj0KuVyO7t2749NPP8Wrr74KALCysoKrqyt++eUX7Ny5E4cPH4aJiQnGjBmDrVu34pVXXsHDhw+xbds2eHh4YPLkyfD394etrS0yMjKwceNGAEDz5s2xatUq9O3bVwxB1tbWePnll7F582aEhobC3d0dgiDg8OHD2LhxI5o3bw6ZTIbk5GTs2bMHGRkZcHR0BFD0GzdjxowBAJVytGnTBtHR0WLPioeHByIjI/HFF1/AxcUFubm56NWrF7Zu3QpPT090794doaGhyMzMxMaNG3Hs2DGMHTsWOTk5OHToEIKCglBQUABra2sMGzYMt2/fRqtWrbBq1SqkpKSgRYsWSElJQceOHWFkZIQPP/wQxsbGMDIyQmpqKqZPn47r168jKSkJwcHBuHbtGt555x0YGxtj4cKFaNmyJXr37o3evXsjICAAbdu2xeuvv44dO3bAy8sL1tbWWL9+PXx8fPDSSy9h4cKF8PT0FOd98OBBJCQkAADu37+PVq1aISEhAdu2bUPLli2xf/9+uLq6wsLCAs7Ozti4cSOCgoJw5MgR8az17t274vp36tQJY8eOxaBBg9CyZUtcunQJ/v7+CAwMRHBwMEaPHg1BEPDnn3/CyMgIf/75J9q1awcjo6KrjYGBgZg5cyY2bNgAAAgJCUFMTIx4JmZsbIxevXoBAL799ltx2wQGBiI/Px/W1tbYt28fLC0tcenSJQDAjBkzNG6boUOHolatWuL6enp6im1n7ty52L9/PzZu3FhsPcLDwzW2xRs3bsDBwUHc7ocPHxbX99SpU/j7778RHByMK1euQC6Xi23i3LlzyM7OhkwmQ2pqKnJzc+Hn54dt27ahV69eYhvLyMjQ2BZ37doFCwsLPHjwAIGBgZg1a5b4OWrdujXkcjkSExPRpEkTJCYmIjg4GAAwZswYGBsbQxAEbN++HTKZDAUFBYiLi4ORkRHq16+PwMBAREREiMu1srKCqampWGdRUVHo06cPTp8+jadPn8LMzAxz585F69atxTNgY2NjlX/37NkDa2trNG/eHG5ubnBzc8PGjRvRqFEjhIeHw9vbG4IgICEhAc+ePYOfnx+2bNki9uYZGxujVq1a6NOnD3x8fODp6Ym8vDyNdWZpaSmWz9bWFoIgYOPGjfDw8EDLli3x/fffIzg4GAUFBbC0tMTChQtha2uLCxcuQBAEcb+WkJCAt99+G6amppg3bx6Cg4ORmJgothflz7l6O1Ds7wBg//79MDEx0bgPqV+/vrifPHDgAHr06IGEhAS8/vrrOHr0qLjd5s6dK85vy5Yt4jx27NiB1157Dba2tujQoQPs7OywcOFC5OXlwcvLC/fv38f06dNhY2MDY2NjcX6zZ88W67JDhw7Iy8tDcnIyHj9+jJycHPj5+QEAzM3NYWNjg+TkZOTk5EAul0Mmk8HExASmpqZITk6GnZ2dWI+KbXLixAmMGzcOv//+O44ePYpDhw4Vq3MvLy/06NEDgwYNQqtWreDn5yfOTxFGv//+e8TExGDQoEGYNm0aYmJiMGfOHAwdOhRGRkZ49913YWNjg3HjxuH58+dwcXHBuHHjcObMGVy5cgV5eXnYsWMHZs2ahU2bNkEQBNSuXRsmJibIy8srth7Kbfavv/7Cq6++irp168LU1BQXLlwQ66VOnTri+r777rtYvHgx6tatC2dnZ7HNGhkZwcfHRyzf4cOHERERAUEQsHbtWjg6OqJ58+YAALlcLu4PCgsLYW9vj5SUFJV1VwRZRdt+9uwZ5HI5ateujcePH8Pc3BwpKSno3r27+Bnw8fFBcHAwnjx5ovXx3uACyKRJk3Dq1CmMHz8eDRo0wJo1awAAw4YNQ+vWrdG1a1cEBwdj0qRJiIuLAwC0aNECJiYm8Pf3R3x8PE6ePInQ0FCcPHkSQUFB4oHMxMQEgYGB8PDwwKpVq8SUChRdYgGKPiyRkZEwMjKCv78//P398ejRI1y7dg02NjY4fPgwrKysAAAffvghHj58iDVr1iA6OhpbtmwR5+fl5YXhw4fD3t5epRxDhgxBenq6OF1WVhbmzJkDS0tLNGzYEN988w1CQ0Nx/PhxBAcHi2fqy5cvBwB07doVeXl5uHv3rjiP7OxssawJCQk4d+4cbty4AWNjY6Snp8PDwwNXrlyBo6MjBg8eDADw8/PDxYsX0aVLF8hkMuTk5KBLly5ISEhAmzZt0LZtWwCAu7u7uBwLCwtMmTIFAPDSSy9h586d+Pbbb7F9+3ZYW1uL9dmwYUNcv34dXbp0QZ06ddCsWTOEh4ejZ8+emDdvHkxMiprd66+/jsePH+PixYt46623MHjwYIwfPx6pqano168fZs6cKS57/PjxGD9+PF5++WU0adIE48ePR0FBgbg9g4KC4ObmJraXXbt24fbt2wCAbt264cSJE/Dw8MDo0aPRpk0bcb4+Pj5iWTMzM1GrVi2EhobiyZMnkMvl4rbJzMyEXC6Hv78/5HI5Fi9ejC5duqB+/fqwtrbWuG3MzMyQmZmJ2bNnAwCePHmC+/fvi+08KioKEyZMENfD09MTQUFB4q9AR0REYPHixSptcdeuXZgwYQJSU1Px4YcfinW0a9cuhIaGokuXLkhKSsJnn30mvuenn37C6tWrsXDhQgwZMgQdOnQAUPSL1a6urmIbW7Zsmca2ePToUZibm6Nnz54ICgqCkZGRWO+//vorsrKyMHDgQJw9exYpKSlivXh5eYnbo379+qhbty4+++wzjB8/HkePHhXXNzs7W1xuRkYGjI2NERERAQDipY6IiAjMnz9fbIebNm1CQEAAPvroI1hbW2Px4sX44osvkJGRARMTE8ybNw8eHh548OABmjVrBrlcjuHDh6u0qcTERDHETJkyBUOHDhXnp9j5W1hYYMCAAdi1a5fGOvv222/F8gFAfHw8JkyYgL///lvc1qmpqbh27ZoYbBs3bizWy6hRo+Du7o6ePXvit99+w4MHD2BhYYGlS5fipZdeEueh/jnfuXOn+FlR3tecOXMGAErchyj2kwcOHMBXX32FjIwM3Lx5Ezt37hS3W5MmTVT2XWPGjEHXrl3Ro0cPrFmzRvyhUcUlB7lcjlmzZsHX1xcAkJaWhoiICHF+jRs3Futy165d6NmzJ8aPH4/k5GT07NlTXL9evXohPz8f48ePBwC4uLhgypQpCA8PR6NGjTB+/Hi4urpi6NCh4nJ9fX0RGxuL0NBQbNu2TfwhU/U6b9++PZo0aYIJEyagSZMmyM/Px4QJE9CgQQP069cP/fv3x4gRI9CqVSt89tln2Lx5M5ydncXPTWBgIAYMGIC+fftiwYIFKCwsxPz587FgwQJYWFiI5enfvz+srKzQrVs38XO+efNmjB07tth6KEJ3eno6zp49i549e8LS0hLu7u4q+3fFZRW5XI4+ffrg2LFj6N27Nxo2bIixY8eKbXb27Nni5WZXV1exDP/3f/+HOnXqoFOnTgCKeksV6/Xpp5/C1NQU//vf/1TW/fHjx2LdRURE4IcffsDjx4/x5ZdfYunSpVi9ejXmzZsHAGjdurW4fZctW4YRI0ZAWwZ3CUYhKysLS5Yswf79+xEeHo4pU6bA3t4eX3zxBZYuXSo2BkB1nEZYWJjYpfXs2TMcOHAAvr6+WL58OQYPHoz+/fsDKEr2+/fvx4cffojly5dj0KBBCAgIEJc/c+ZMfP311wCABQsWYOLEicXKePjwYUydOhXffPMN2rRpg1WrVoldqwCQl5eHlJQUxMbGYvr06Vi5ciXi4+OxYMECzJw5E0uXLsUHH3yAFi1aoF27dti1axfmz5+PmTNnYvLkyejevTu6du2K5cuXo1mzZsjMzMSoUaOQkpKCyZMni70cX331Fb755hu0bdtWpQy7du3C0aNH4efnh/DwcIwePVqss8OHD2PTpk0YPnw42rdvj9WrV+ODDz7AiRMnMGnSJKxevbpYPaenp4vha9euXVi0aBHCw8Px1VdfIS0tDevWrUPbtm0RHBwMS0tL9OrVC0uWLEFgYCD69u2LXbt24dixY+jVqxeWLl2KPn364KOPPgIAHDlyBL/88guGDBmCvLw8/Pnnn+J6HDhwAFu2bIG/vz8mT56M5s2bY+zYsRg3bhz8/PzQtWtXLFu2DJ07dxYProproD4+Pjh8+DB++eUXjB49Gq6urtiyZYsYSg8cOID8/Hykp6djwYIF8PPzQ7NmzbB+/Xp06dIFvr6+iIyMRGJiIgoKCmBubo68vDxMmjQJ8+fPh6WlJby9vXHs2DFkZGTg2bNn6N+/P44ePYrbt2/D2NgY48aNw549e5CdnQ1zc3NkZGQgLy8PQUFB2LhxI+7cuQMbGxvUqlULRkZG6NKlCzp27IiVK1eqzGP9+vX466+/xJ+6fvfdd9G+fXtxOsVZ+9atW9G4cWMUFBRALpfj9ddfF89GAWD37t14/vw57t+/j4CAAISFhSE3NxenT5/G6NGjERQUhBUrViA2NhYeHh7Ytm2bOL9//vkHVlZWsLGxwZtvvonx48ejU6dO2LZtG9atW4emTZti7ty5sLW1RUFBAWxtbeHt7S2WvXHjxmL9/fjjj3j06BFcXV3x5MkT+Pv7q0xnZ2eHkJAQsbcT+G+8BFD0C9uKHsecnBxx3IKrq6s4buH06dMoKChAfHw8Zs2ahZCQkGLjmRTTaRpvppCdnY1atWohPDwct27dQvfu3bFnzx7Y2tpi1apVACCOA1i5ciViY2NRt25dBAUFYfXq1cjOzkZ4eDhWrFgBb29v9O3bF2FhYUhISMCnn36KvXv3Ijc3F3369EH//v2RmJiIfv36YejQoeLlyTp16mDRokX4/fffMXToUEyfPh0XL17E3bt34eLigoiICBQWFuKff/6BnZ0dUlNTxUs4JiYmOHXqFL7++msMHDgQ7777rjjv2NhYzJ07FxkZGXBycsL169cRFBSE9957D71798aYMWPEOtu7dy/S0tKKjS9RbAMzMzN07NgRI0eOhK+vL+rVqwe5XK5xXF5pda7cztWnUx4Pt2PHDnh6eiIkJASZmZkIDg7G3r17cfXqVbRs2RIZGRmQy+XIycmBjY0NvLy8sGXLFjg5OaF3794qbUXT/NUfnz9/Hg8fPlR5n3JZNbWdI0eOIDk5uVidKU+3Y8cOrFy5EnK5HHZ2dpg2bRqaNWumMnZMvS6UX1OvI+V2X9py//rrL9y7dw8JCQmlTlfaNihturIYXABRDPIBigZ2mpmZid1NVlZWuHnzJk6ePImRI0di9erVAIAOHTpgwIABcHBwwMSJExEeHo67d+9i586dqFu3LkaNGoV169YhKysLbm5uAIB9+/bB2NgYCxYsKPba8ePHkZKSAj8/P/E6682bN4uV7+jRozA1NYW/vz969OiBLVu2iNe+Spru5MmTaN68OS5fvoyTJ0+iWbNm4gZTXt/CwkIYGRkhODhYvMZ36NAhzJo1C6dOnUKzZs1gZ2en8li9DH369MEPP/wAHx+fYnXm7++PNWvWYNasWbhw4QIePnyIjh07qpRB/T0lbZv69evD0tISzs7O6NGjB4YPH46LFy8WW6625enRowdGjhyJjh07FttWiu27du3aYnV07949BAcHi+N1hg4dio8//rjYvJXrSLnthISEoEePHvD19cW6desAAG5ubpgzZw6++uorpKeno3Hjxvj7778RFRWFkydPwtbWFi1atMDNmzcxbdo0PHnyBFFRUbhx4wY++eQTWFpa4s6dO+LgzcuXL2PatGkq81Ce9+TJk9GhQwf4+Phg2bJlKvNo0KABAKBu3bqlTufm5oaoqChcvnwZADB27FgsWrQIQNGYgytXrmDy5MmYO3cunjx5gujoaHE9Fi9ejE2bNuHixYtYu3YtZs6cWWx+Hh4euHr1Knr16gVnZ2ckJCSgTp06iIuLQ4sWLcSeQOXpFIMj7ezsVNbdxsYGLVq0wJ07d4pNN3nyZIwcOVLcFsrjSJTHhE2fPh2enp4YM2YMGjZsiLCwMKSmpqJDhw7Yu3cvmjZtiunTpyMiIgLW1taoU6cOrK2tcffuXdjb2xcbbwYAr776Klq0aAF3d3dkZmZi+/btGDRoEOLj42FqaoqHDx9i9+7d8PT0ROfOnWFubo4jR44AAOLi4lS2R1JSEkxNTcX9kKJdRURE4Ouvv8ahQ4dw+vRpTJs2DQcPHkSvXr1QUFCAI0eOICIiAps2bUJsbCxefvllrF69GlOmTMGtW7fQoEEDWFtb4+nTp3BycsKyZcswevRomJqawsrKSqUtAoCnpydmz54tbl/F5/TSpUv4/vvvsWfPHkyaNEkcdKg+XWxsLHr06IE33ngDDx8+xHfffSeOS0tOThbHdx06dEgcjG5tbY3Hjx+je/fuxbaNcp0LgoBXXnkFXbp0gbm5Ofbu3QugqOdi//79sLKywvDhw8VtrajzP/74A4WFhYiOjsa0adNw4MABnDp1CmFhYTh06JC431Zui40aNUJcXBwmTZpUbD2eP3+OHTt2YNCgQSrbXbHcoKAgNGrUSGVcX25uLmQyGSIjIyEIAry8vMS2k5ycjMuXLyM0NBR3797F1atXsWzZMgBAu3btxPX9448/4O3tLV6CioqKQo8ePVBQUIADBw6gQ4cO4vgVe3t79OzZU6WOzp8/L/ZiK6ZTtHvl5arX8+HDh1G3bl1MnDixWPlatmyJV199FYIgqGyDKVOmICQkRJyfh4eHON358+fRoUMH8RJ3WQzuEoyFhQW+//57AEBQUBAAoHPnzjhx4gRMTEwQEhICY2NjsdsLKDoYzp07F40aNYKDg4P4PplMhh9//BEWFhZwd3dHbm6uOO/MzEx069ZN42uffPIJ5HI5Vq5cqVIO9fKNHDkSxsbGmD9/PqZOnYrTp0+XOd0rr7yCS5cuYcKECeK1ZsXGUl7fvn37wtvbWyxffn4+bG1tMX/+fLRr1w6XLl0SByIqHquXwdnZGba2thrrzN7eXpxf27ZtYW1tjQ0bNqiUQf09JW2bo0ePwszMTKyHjIwMjcvVtjxTp07Fs2fPxHpR3laOjo4ICgpC7dq1i9XR7t27xXbg7u6Ojz/+WOO8letIue0EBATAxcVFnN/Vq1eRlJQEBwcHpKenQy6XIyUlBbdu3UJeXp6Y+gVBQHJyMlJSUuDg4ACZTIZVq1YhLi4OtWrVQq1atXD69Gmkp6eL0ynPQ3neVlZWqF27NjIyMorN486dOzA3N4dMJit1uoyMDPF5Ozs7/PTTT8jMzAQAnDx5EkBRd/f8+fORnZ2tMm5JMd7nvffew4IFC5Cbm1tsfhkZGfjhhx+Qm5uLp0+fim1nwoQJOHr0qMbpFGUHUKz+CgoKNE5nZWWFvXv3ir1V27ZtE69bx8TEiGPCQkNDIZPJxHELV69exZEjR7Bx40a0atUKZ8+eBQD8/vvvqFWrFhYvXozExEQMGzZMHBdQp04dWFpaimNq7t27h0uXLuHYsWMYPXo03n77bXTv3h3Dhg1DgwYNIJfLcfr0aTx//lwcr9O7d29s27at2PZYuHAhxowZU6xdOTo64saNG8jPz4eDgwOys7Px9ttvq4wZUmyP1157Dbdu3YKjoyNMTU3RokULfPvtt0hMTERgYCBq166NVatW4fLly2jUqJFYv4q2aGdnh4KCAnF+Q4YMQX5+PjZs2ID3338fu3fvxrNnz2BlZaXSDpSnGz58OOzs7MSu+eXLl4tjn0aPHo033ngDCQkJ6NatG4yNjbF8+XIkJibC399f47ZRjPFT1HlCQoJYlyNGjMChQ4fEsXY3btzAsWPHEBoairy8PHG6unXr4sGDB3BwcMCff/6J/Px8ODo6ws7OTmXdldticnIyXFxcSlwPxbZWfqxoY4qeROVxfVeuXIGRkZHGtjNu3DhxALS7uzuMjY01rq+npyeeP3+OgoIC5OXlqbSDzp07i+1UURfqdRQUFISXXnpJHD+p3O6bN28OExMTjctVjIfSVL60tLRiyz127BicnJzg6OiocbqgoCDxuKkVwcDcvXtXfHz8+HHh6dOn4uMdO3aIryk/Vjhw4IDQt29fledWrFghHDhwQJg8ebLKvAVBEJ4+farxtbt374rLVUynqXw7d+5UeW3FihVlTnf8+HGV6b755huN66tYR0X5du7cqTI/xTyUH6uX4fjx4yrrq1xnyvO7e/eu+D5NZdC0TsrT7dy5U2W6L774QuNytS2PIAhCeHi4yv8V22rQoEHF5qGoIwX1/6vPW7mONL1H8TgqKkqIjo4WBEEQoqOjhR49egi3b98WoqKihG+//VZ874wZM4SQkBDh9u3bQmFhoTB//nxhzpw5wtKlS4Xdu3cLT58+FRYsWCD88MMP4nTK81CetyAIwpkzZ4QdO3YUm0dQUJAQGBhY5nTz588XlixZIsyZM0f4+eefhdDQULGskZGRwquvvip8+eWXgq+vrzB27FjxtYiICPHxw4cPhYMHDxab308//STcvHlTfC0kJES4cuWKIAiCUFhYKJbn559/VplOuezq9bdq1SqN0wmCIAwfPlycburUqcKiRYsEQRCEoUOHio9jYmIEKysrYdiwYcKXX34pDBs2TBg/frwwbtw44ZVXXhGf79mzp7B48WKV7X7y5Elh3LhxgoeHh8rzHTt2FB/7+voKTk5OgiAIwpYtW4Q6deqI2/TDDz8UBEEQrl+/LhQWFgq+vr7CnDlzhCVLlqhs+ytXrmhsV1FRUcKMGTMEQRCEkSNHCtu3bxeuX78uCIKgsi9Tfs/JkyeF7du3i68p1/vXX38tBAUFFWuLP//8sxAVFaWy3grR0dFiuxQEQVizZo3G6SIjI1Xq+NVXXxVf8/PzE5ycnITr168LJ0+eFIKDg0t8n2LbqNd5p06dxLpUrP+4ceMENzc3cZqYmBjB3NxcnC4qKkr44IMPitVlYWGhMGnSJI1t8f333xf69OmjcT2Ut7XyY/U21qxZM2Hx4sXC9evXhalTp6qsr3LbCQkJEczNzYUvv/xSaN26tUr7U17f6OhooVWrVsLt27eFkSNHCmfPnhXrITg4WGynjRs31lhHAwcOFLeXersvbbmRkZGCu7u7xukWLVokzk95GwwePFisF/XpFOXQlsEFECKqXHPmzBGSkpKE3NxcYf78+VVdHJ0oypuWlqZS9nnz5gm5ubkq65WZmSnExMSUub6K6ZRfUxzIFMuaN2+eyrJKovy+itLnvPRFuY7Vy6dcL+qvlbRtlOtcfdvMmDFDyMzMFPbt21dsW6tPp6/1UN7Wmra7+npoKoN6eSIiIjS+R9P6aqJ4vqR2qv58We1efblhYWGlTlfWNlBfri77FIO7BENE+qU8dkcxvik2Nla8ZqtpgLWh0FT2CxcuqDwWBAG7d+/GxYsXS5xO0/qWNG/F/K5du6by2sWLF8V5fPnll8XmoXhNMXi9Iuta0XlVBvXylVVHirLrsg0vXLigMt21a9dK3dblqSdt10N9ncpqY9euXStxfnFxcaWur/J6aFO+kparXn+xsbFa1fONGze0mk55ucr1or4eWu9TtI4qRFQtjRgxQuXx6NGjxf8rPzZEJZVdfT3c3d21mk75cWn1UtL8SpuH+mu60ue8KoN6+cpTR/rYhsrTqS9Ln+uhj/KVZz0MsXyVtT0YQIhqOG3HNxmiksquvh4XLlzQarqSxnNpO7/S5qH+mq70Oa/KoF6+8tSRPrah8nTqy9LneuijfOVZD0MsX2VtD4P7Gi4RERHVfPw1XCIiIpIcAwgRERFJjgGEiIiIJMcAQkRERJJjACEiIiLJMYAQERGR5BhAiIiISHIMIERERCS5/wfLPeAqQiWjQgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import scipy\n",
    "from scipy.cluster import hierarchy\n",
    "dendro=hierarchy.dendrogram(hierarchy.linkage(X,method='ward'))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cde27332-fe9d-442a-b613-98bcdcb908b5",
   "metadata": {},
   "source": [
    "## 我们还可以利用另外一个方法：肘部法则（Elbow method）来寻找最优的聚类个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "892ded87-a0a3-41b2-9a8f-044d442afd3f",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'wcss: sum of dist. of sample to their closest cluster center')"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.cluster import KMeans\n",
    "wcss=[]\n",
    "for i in range(1,10):\n",
    "    kmeans=KMeans(n_clusters=i,init='k-means++',)\n",
    "    kmeans.fit(X)\n",
    "    wcss.append(kmeans.inertia_)\n",
    "    \n",
    "plt.plot(range(1,10),wcss)\n",
    "plt.title('Elbow Method')\n",
    "plt.xlabel('No. of cluster')\n",
    "plt.ylabel('wcss: sum of dist. of sample to their closest cluster center' )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0e1495c-fcf7-48d0-aeb7-28bf28ae8c34",
   "metadata": {},
   "source": [
    "## 5. 用Kmeans聚类，聚类个数=5\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "使用标准化后的数据X来进行聚类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "4c0ebddc-6b5a-4901-a540-0575c52706c6",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "kmeans_1=KMeans(n_clusters=3)\n",
    "kmeans_1.fit(X)\n",
    "cluster_pred=kmeans_1.predict(X)\n",
    "cluster_pred_2=kmeans_1.labels_\n",
    "cluster_center=kmeans_1.cluster_centers_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "id": "7754a9e9-e8ce-4dca-aeb9-95eee033649c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2,\n",
       "       2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0,\n",
       "       2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0,\n",
       "       2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2])"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 聚类结果\n",
    "cluster_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "c9315d8a-086b-427d-9a81-6c03e5980a73",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2,\n",
       "       2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0,\n",
       "       0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0,\n",
       "       2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2])"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cluster_pred_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "dbd3af6b-630c-4ede-b40d-96f6c8403903",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.00960265,  0.89939603, -1.31476242, -1.2674011 ],\n",
       "       [ 1.02692225,  0.02081579,  0.93724759,  0.96583729],\n",
       "       [-0.1743434 , -0.96338865,  0.25130388,  0.16770004]])"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 类中心点\n",
    "cluster_center"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "id": "a1912b02-425a-4d7a-af06-c2d7420d74d8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8466666666666667\n"
     ]
    }
   ],
   "source": [
    "\n",
    "a = 0\n",
    "for i in range(150):\n",
    "    if i <50 and cluster_pred[i] ==1:\n",
    "        a +=1\n",
    "    if 50<=i<100 and cluster_pred[i] ==2:\n",
    "        a +=2\n",
    "    if  100 <i < 149 and cluster_pred[i] ==0:\n",
    "        a +=0\n",
    "print(a/150)        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "8abd5a86-828a-429c-94aa-204e5e056638",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.47333333333333333\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "kmeans_1 = KMeans(n_clusters=3)\n",
    "kmeans_1.fit(X)\n",
    "cluster_pred = kmeans_1.predict(X)\n",
    "cluster_pred_2 = kmeans_1.labels_\n",
    "cluster_center = kmeans_1.cluster_centers_\n",
    "a = 0\n",
    "for i in range(151):\n",
    "    if i < 50 and cluster_pred[i] == 0:\n",
    "        a += 1\n",
    "    elif 50 <= i < 100 and cluster_pred[i] == 1:\n",
    "        a += 2\n",
    "    elif 100 <= i < 149 and cluster_pred[i] == 2:\n",
    "        a += 0\n",
    "print(a / 150)  # 假设X的长度为150，所以用len(X) - 1来计算比例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "988837ae-d789-4540-94c4-b9c654ebfbc0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.21476510067114093\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cluster import KMeans\n",
    "\n",
    "# 假设X是你的数据集\n",
    "\n",
    "# 初始化正确计数器\n",
    "a = 0\n",
    "\n",
    "# 遍历数据集，根据你的标准来增加计数器\n",
    "for i in range(len(X)):\n",
    "    if i < 50 and cluster_pred[i] == 0:\n",
    "        a += 1\n",
    "    elif 50 <= i < 100 and cluster_pred[i] == 1:\n",
    "        a += 2\n",
    "    elif 100 <= i < 150 and cluster_pred[i] == 2:\n",
    "        a += 1  # 这里应该是增加1，因为你的意图是计算正确的数量\n",
    "\n",
    "# 计算正确率\n",
    "accuracy = a / len(X)\n",
    "\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ddb69653-9636-4d84-991f-47aa9ce0772e",
   "metadata": {},
   "source": [
    "## 作业\n",
    "作 业： 1. 分离数据中的第1列 （Label);\n",
    "             2. 第二列到最后的： Data\n",
    "             3. PCA 降维到 2维\n",
    "             4. 判断可能存在几类？\n",
    "             5. 用KMeans进行聚类\n",
    "             6. 统计正确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "720902a9-998b-43bd-b21b-2b23224039e8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>14.23</td>\n",
       "      <td>1.71</td>\n",
       "      <td>2.43</td>\n",
       "      <td>15.6</td>\n",
       "      <td>127</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.06</td>\n",
       "      <td>0.28</td>\n",
       "      <td>2.29</td>\n",
       "      <td>5.64</td>\n",
       "      <td>1.04</td>\n",
       "      <td>3.92</td>\n",
       "      <td>1065</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>13.20</td>\n",
       "      <td>1.78</td>\n",
       "      <td>2.14</td>\n",
       "      <td>11.2</td>\n",
       "      <td>100</td>\n",
       "      <td>2.65</td>\n",
       "      <td>2.76</td>\n",
       "      <td>0.26</td>\n",
       "      <td>1.28</td>\n",
       "      <td>4.38</td>\n",
       "      <td>1.05</td>\n",
       "      <td>3.40</td>\n",
       "      <td>1050</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>13.16</td>\n",
       "      <td>2.36</td>\n",
       "      <td>2.67</td>\n",
       "      <td>18.6</td>\n",
       "      <td>101</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.24</td>\n",
       "      <td>0.30</td>\n",
       "      <td>2.81</td>\n",
       "      <td>5.68</td>\n",
       "      <td>1.03</td>\n",
       "      <td>3.17</td>\n",
       "      <td>1185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>14.37</td>\n",
       "      <td>1.95</td>\n",
       "      <td>2.50</td>\n",
       "      <td>16.8</td>\n",
       "      <td>113</td>\n",
       "      <td>3.85</td>\n",
       "      <td>3.49</td>\n",
       "      <td>0.24</td>\n",
       "      <td>2.18</td>\n",
       "      <td>7.80</td>\n",
       "      <td>0.86</td>\n",
       "      <td>3.45</td>\n",
       "      <td>1480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>13.24</td>\n",
       "      <td>2.59</td>\n",
       "      <td>2.87</td>\n",
       "      <td>21.0</td>\n",
       "      <td>118</td>\n",
       "      <td>2.80</td>\n",
       "      <td>2.69</td>\n",
       "      <td>0.39</td>\n",
       "      <td>1.82</td>\n",
       "      <td>4.32</td>\n",
       "      <td>1.04</td>\n",
       "      <td>2.93</td>\n",
       "      <td>735</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>173</th>\n",
       "      <td>3</td>\n",
       "      <td>13.71</td>\n",
       "      <td>5.65</td>\n",
       "      <td>2.45</td>\n",
       "      <td>20.5</td>\n",
       "      <td>95</td>\n",
       "      <td>1.68</td>\n",
       "      <td>0.61</td>\n",
       "      <td>0.52</td>\n",
       "      <td>1.06</td>\n",
       "      <td>7.70</td>\n",
       "      <td>0.64</td>\n",
       "      <td>1.74</td>\n",
       "      <td>740</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>174</th>\n",
       "      <td>3</td>\n",
       "      <td>13.40</td>\n",
       "      <td>3.91</td>\n",
       "      <td>2.48</td>\n",
       "      <td>23.0</td>\n",
       "      <td>102</td>\n",
       "      <td>1.80</td>\n",
       "      <td>0.75</td>\n",
       "      <td>0.43</td>\n",
       "      <td>1.41</td>\n",
       "      <td>7.30</td>\n",
       "      <td>0.70</td>\n",
       "      <td>1.56</td>\n",
       "      <td>750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>175</th>\n",
       "      <td>3</td>\n",
       "      <td>13.27</td>\n",
       "      <td>4.28</td>\n",
       "      <td>2.26</td>\n",
       "      <td>20.0</td>\n",
       "      <td>120</td>\n",
       "      <td>1.59</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0.43</td>\n",
       "      <td>1.35</td>\n",
       "      <td>10.20</td>\n",
       "      <td>0.59</td>\n",
       "      <td>1.56</td>\n",
       "      <td>835</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>3</td>\n",
       "      <td>13.17</td>\n",
       "      <td>2.59</td>\n",
       "      <td>2.37</td>\n",
       "      <td>20.0</td>\n",
       "      <td>120</td>\n",
       "      <td>1.65</td>\n",
       "      <td>0.68</td>\n",
       "      <td>0.53</td>\n",
       "      <td>1.46</td>\n",
       "      <td>9.30</td>\n",
       "      <td>0.60</td>\n",
       "      <td>1.62</td>\n",
       "      <td>840</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>177</th>\n",
       "      <td>3</td>\n",
       "      <td>14.13</td>\n",
       "      <td>4.10</td>\n",
       "      <td>2.74</td>\n",
       "      <td>24.5</td>\n",
       "      <td>96</td>\n",
       "      <td>2.05</td>\n",
       "      <td>0.76</td>\n",
       "      <td>0.56</td>\n",
       "      <td>1.35</td>\n",
       "      <td>9.20</td>\n",
       "      <td>0.61</td>\n",
       "      <td>1.60</td>\n",
       "      <td>560</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>178 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     0      1     2     3     4    5     6     7     8     9      10    11  \\\n",
       "0     1  14.23  1.71  2.43  15.6  127  2.80  3.06  0.28  2.29   5.64  1.04   \n",
       "1     1  13.20  1.78  2.14  11.2  100  2.65  2.76  0.26  1.28   4.38  1.05   \n",
       "2     1  13.16  2.36  2.67  18.6  101  2.80  3.24  0.30  2.81   5.68  1.03   \n",
       "3     1  14.37  1.95  2.50  16.8  113  3.85  3.49  0.24  2.18   7.80  0.86   \n",
       "4     1  13.24  2.59  2.87  21.0  118  2.80  2.69  0.39  1.82   4.32  1.04   \n",
       "..   ..    ...   ...   ...   ...  ...   ...   ...   ...   ...    ...   ...   \n",
       "173   3  13.71  5.65  2.45  20.5   95  1.68  0.61  0.52  1.06   7.70  0.64   \n",
       "174   3  13.40  3.91  2.48  23.0  102  1.80  0.75  0.43  1.41   7.30  0.70   \n",
       "175   3  13.27  4.28  2.26  20.0  120  1.59  0.69  0.43  1.35  10.20  0.59   \n",
       "176   3  13.17  2.59  2.37  20.0  120  1.65  0.68  0.53  1.46   9.30  0.60   \n",
       "177   3  14.13  4.10  2.74  24.5   96  2.05  0.76  0.56  1.35   9.20  0.61   \n",
       "\n",
       "       12    13  \n",
       "0    3.92  1065  \n",
       "1    3.40  1050  \n",
       "2    3.17  1185  \n",
       "3    3.45  1480  \n",
       "4    2.93   735  \n",
       "..    ...   ...  \n",
       "173  1.74   740  \n",
       "174  1.56   750  \n",
       "175  1.56   835  \n",
       "176  1.62   840  \n",
       "177  1.60   560  \n",
       "\n",
       "[178 rows x 14 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "%matplotlib inline\n",
    "\n",
    "df = pd.read_csv('wine.txt', delimiter=',',header=None)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9ba41f2b-e317-4944-90a1-ac46b4ff5b73",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_data=df.iloc[:,1:] #提取出除了第一列的所有列\n",
    "y_label=df.iloc[:,0] #提取第一列\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca02029e-f8fc-454f-98d1-536f4623132a",
   "metadata": {},
   "source": [
    "## 标准化数据，利用PCA降维"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "296e0f72-e9ab-48e7-92ce-e1bd7fd19c4d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>principal component 1</th>\n",
       "      <th>principal component 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3.316751</td>\n",
       "      <td>-1.443463</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.209465</td>\n",
       "      <td>0.333393</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.516740</td>\n",
       "      <td>-1.031151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.757066</td>\n",
       "      <td>-2.756372</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.008908</td>\n",
       "      <td>-0.869831</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>173</th>\n",
       "      <td>-3.370524</td>\n",
       "      <td>-2.216289</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>174</th>\n",
       "      <td>-2.601956</td>\n",
       "      <td>-1.757229</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>175</th>\n",
       "      <td>-2.677839</td>\n",
       "      <td>-2.760899</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>-2.387017</td>\n",
       "      <td>-2.297347</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>177</th>\n",
       "      <td>-3.208758</td>\n",
       "      <td>-2.768920</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>178 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     principal component 1  principal component 2\n",
       "0                 3.316751              -1.443463\n",
       "1                 2.209465               0.333393\n",
       "2                 2.516740              -1.031151\n",
       "3                 3.757066              -2.756372\n",
       "4                 1.008908              -0.869831\n",
       "..                     ...                    ...\n",
       "173              -3.370524              -2.216289\n",
       "174              -2.601956              -1.757229\n",
       "175              -2.677839              -2.760899\n",
       "176              -2.387017              -2.297347\n",
       "177              -3.208758              -2.768920\n",
       "\n",
       "[178 rows x 2 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = StandardScaler().fit_transform(X_data)\n",
    "pca = PCA(n_components=2)\n",
    "principalComponents = pca.fit_transform(x)\n",
    "principalDf = pd.DataFrame(data = principalComponents\n",
    "             , columns = ['principal component 1', 'principal component 2'])\n",
    "principalDf"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d6b06a7-8f88-4f6d-a72b-326223214446",
   "metadata": {},
   "source": [
    "## 聚类分析\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11fe8d28-eeb0-42ae-a5bd-8be42fed3dc3",
   "metadata": {},
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "std = StandardScaler()\n",
    "X = std.fit_transform(x*1.0)\n",
    "import scipy\n",
    "from scipy.cluster import hierarchy\n",
    "dendro=hierarchy.dendrogram(hierarchy.linkage(X,method='ward'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0a3bb62a-0fa8-46da-8ced-770248d8bfe4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "std = StandardScaler()\n",
    "X = std.fit_transform(x*1.0)\n",
    "import scipy\n",
    "from scipy.cluster import hierarchy\n",
    "dendro=hierarchy.dendrogram(hierarchy.linkage(X,method='ward'))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e6151e7-4b6b-429e-b6f2-a8ba48b7e26d",
   "metadata": {},
   "source": [
    "可能存在三类"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a93a6e4c-ed47-4ecc-96b0-efb44c0d7544",
   "metadata": {},
   "source": [
    "肘部算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "651de0ac-1c75-4bab-9d81-dbef9b888e7d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n",
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'wcss: sum of dist. of sample to their closest cluster center')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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m29qvP7xxx8jKioKc+fOBQC0bt0aKSkp+Pe//613QfRP13B0dIS1tTXMzc3h7u7+wOt88MEHGD16NN577z1tW9u2bSV8Wl1Xr15F+/bt0alTJwDVk7LvcnFxAQA4OTnpZJo/fz6WLFmiHZny9/dHSkoKVq5cqVMQTZ8+/YGjV0RUO7xlRkRGtWjRIqxZswYpKSk1Xjt79iy6deum09atWzdcvHgRarVar+sb4hoAkJSUhKioKL37/5OXXnoJ69evR7t27fD6668jPj7+b/vn5eUhIyMDEydORLNmzbSPBQsWIDU1Vafv3SKLiAyHBRERGVXPnj0xcOBAvPnmmzVeE0WxxgRnURQlXd8Q1wAAKysrvfsqFIoaP+evk5sfffRRpKenY/r06cjMzERUVBRmzZr1wGtqNBoA1bfNkpKStI/k5GQkJibq9LWxsdE7KxHphwURERndRx99hK1bt9YYJQkJCcHBgwd12uLj49G6dWuYmJjodW1DXAMA2rRpg927d+vV9+4tr6ysLG3b/ZbQu7i4YMKECfj+++/xySef4MsvvwQA7Zyhe0ew3Nzc0Lx5c1y+fBkBAQE6j7uTsInIeDiHiIiMLjw8HGPHjsVnn32m0z5z5kx07twZ8+fPx6hRo5CQkIDly5frrKyKiorC8OHD8corr9z32vpcQx/z5s1DVFQUWrZsidGjR6Oqqgq///47Xn/99Rp9rays0LVrV3z00Ufw8/PDjRs38Pbbb+v0eeedd9CxY0eEhoaivLwc27ZtQ3BwMADA1dUVVlZWiI2NhZeXFywtLaFUKvHuu+9i6tSpsLOzw6OPPory8nIcO3YMBQUFmDFjhqTPQ0TScISIiOrE/Pnza9zK6tChAzZs2ID169cjLCwM77zzDt5//32dCdWpqam4cePGA6+rzzX00bt3b/z888/YsmUL2rVrh759++Lw4cMP7P/tt9+isrISnTp1wrRp07BgwQKd183NzTFnzhy0adMGPXv2hImJCdavXw8AMDU1xbJly7By5Up4enpi6NChAIBJkybh66+/xurVqxEeHo5evXph9erVHCEiqgOCWJub7URERESNCEeIiIiIqMljQURERERNHgsiIiIiavJYEBEREVGTx4KIiIiImjwWRERERNTksSAiIiKiJo8FERERETV5LIiIiIioyWNBRERERE0eCyIiIiJq8lgQERERUZP3/yhjMzC9EIPbAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.cluster import KMeans\n",
    "wcss=[]\n",
    "for i in range(1,10):\n",
    "    kmeans=KMeans(n_clusters=i,init='k-means++',)\n",
    "    kmeans.fit(X)\n",
    "    wcss.append(kmeans.inertia_)\n",
    "    \n",
    "plt.plot(range(1,10),wcss)\n",
    "plt.title('Elbow Method')\n",
    "plt.xlabel('No. of cluster')\n",
    "plt.ylabel('wcss: sum of dist. of sample to their closest cluster center' )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eed86baf-73da-452e-8ec1-8defdecf6b55",
   "metadata": {},
   "source": [
    "利用KMeans进行聚类，聚类个数=3\r\n",
    "使用标准化后的数据X来进行聚类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b8fccc9f-3f91-44e9-aaf3-e725bc3eafe8",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KMeans(n_clusters=3)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;KMeans<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.cluster.KMeans.html\">?<span>Documentation for KMeans</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KMeans(n_clusters=3)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "KMeans(n_clusters=3)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "kmeans = KMeans(n_clusters=3)\n",
    "kmeans.fit(X)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "3dbb327b-7736-4a16-9458-647a1cd13159",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\anaconda3\\Lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1446: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "kmeans_1=KMeans(n_clusters=3)\n",
    "kmeans_1.fit(X)\n",
    "cluster_pred=kmeans_1.predict(X)\n",
    "cluster_pred_2=kmeans_1.labels_\n",
    "cluster_center=kmeans_1.cluster_centers_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "32041c02-f823-4a17-9d0d-11a7a035a212",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.83523208 -0.30380968  0.36470604 -0.61019129  0.5775868   0.88523736\n",
      "   0.97781956 -0.56208965  0.58028658  0.17106348  0.47398365  0.77924711\n",
      "   1.12518529]\n",
      " [-0.92607185 -0.39404154 -0.49451676  0.17060184 -0.49171185 -0.07598265\n",
      "   0.02081257 -0.03353357  0.0582655  -0.90191402  0.46180361  0.27076419\n",
      "  -0.75384618]\n",
      " [ 0.16490746  0.87154706  0.18689833  0.52436746 -0.07547277 -0.97933029\n",
      "  -1.21524764  0.72606354 -0.77970639  0.94153874 -1.16478865 -1.29241163\n",
      "  -0.40708796]]\n",
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 1 1 1 1 1 1 1 1 1 1 1 0\n",
      " 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n",
      " 1 1 1 1 1 1 1 2 1 1 0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]\n"
     ]
    }
   ],
   "source": [
    "# 查看模型结果\n",
    "print(kmeans.cluster_centers_) #k个类中心点\n",
    "print(kmeans.labels_)  #每一个样本所属的聚类编号\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "ffa23f36-129f-4b63-adbb-73319bd95ce7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#使用predict方法对指定的数据集X进行预测\n",
    "cluster_label = kmeans.predict(X) \n",
    "cluster_label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "06071379-4c2f-4f30-8dee-493ef49f000b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "# 定义了一个更美观误分类矩阵的函数\n",
    "def show_confusion_matrix(cnf_matrix, class_labels):\n",
    "    plt.matshow(cnf_matrix, cmap=plt.cm.YlGn, alpha=0.7)\n",
    "    ax = plt.gca()\n",
    "    ax.set_xlabel('Predicted Label', fontsize=16)\n",
    "    ax.set_xticks(range(0,len(class_labels)))\n",
    "    ax.set_xticklabels(class_labels,rotation=45)\n",
    "    ax.set_ylabel('Actual Label', fontsize=16, rotation=90)\n",
    "    ax.set_yticks(range(0,len(class_labels)))\n",
    "    ax.set_yticklabels(class_labels)\n",
    "    ax.xaxis.set_label_position('top')\n",
    "    ax.xaxis.tick_top()\n",
    "\n",
    "    for row in range(len(cnf_matrix)):\n",
    "        for col in range(len(cnf_matrix[row])):\n",
    "            ax.text(col, row, cnf_matrix[row][col], va='center', ha='center', fontsize=16)\n",
    "\n",
    "# 误分类矩阵\n",
    "class_labels = [0,1,2,3]\n",
    "cnf_matrix = confusion_matrix(y_label,cluster_label) #cluster_label是聚类结果，y_lab是真实的类标签\n",
    "show_confusion_matrix(cnf_matrix, class_labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d47e1bfe-913b-43b3-ab1c-78e477419880",
   "metadata": {},
   "source": [
    "统计正确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "0df7773f-c1d0-44e9-b121-091a5e60f7bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 2, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cluster_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "c4617cfd-37a0-4714-8c68-cac8273cade3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9044943820224719\n"
     ]
    }
   ],
   "source": [
    "a = 0\n",
    "for i in range(len(cluster_pred)):\n",
    "    if i <(len(cluster_pred)/3) and cluster_pred[i] ==0:\n",
    "        a +=1\n",
    "    if (len(cluster_pred)/3)<=i<(len(cluster_pred)*2/3) and cluster_pred[i] ==1:\n",
    "        a +=2\n",
    "    if  (len(cluster_pred)*2/3) <i < (len(cluster_pred)-1) and cluster_pred[i] ==2:\n",
    "        a +=0\n",
    "print(a/len(cluster_pred)) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8ef3eb98-e26f-4907-9f15-4dad6937fac8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "76603380-c756-4e6f-8cbc-77b0c8e47a18",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "178"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a23e1220-b56d-4b20-8876-6e91a4b9eece",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a6e99b3-e360-4ff8-9838-1c1e37d6bd68",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
